#include "stm32f4xx.h"
#include "delay.h"

/**
	SysTick系统滴答器的时钟来源设置为AHB的8分频，即21MHz，记一个数时间为1/21000000
	1. 自动重装载值为21000，即计时1ms
	2. 自动重装载值为21，即计时1us
	
	SysTick->LOAD是24位的寄存器，最大值是0xFFFFFF = 2^24;
	
	因此能够最大的计数时间为0xFFFFFF/21MHz = 798ms
*/

//微秒级的延时函数
void Delay_us(uint32_t nus)
{
	//记录控制及状态寄存器的值
	uint32_t temp;
	
	SysTick->LOAD = nus*21; //自动重装载值
	SysTick->VAL = 0x00; //计数器值
	SysTick->CTRL = 0x01; //开启计时器
	
	do{
			temp = SysTick->CTRL;
		}while((temp&0x01)&&!(temp&(1<<16)));
	
	SysTick->CTRL = 0x00; //关闭计时器
	SysTick->VAL = 0x00; //清空计数器值
}

//毫秒级延时函数
void Delay_ms(uint32_t nms)
{
	uint32_t quotient = nms/798; //商
	uint32_t remainder = nms%798; //余数
	
	while(quotient--)
	{
		Delay_xms(798);
	}
	if(remainder)
	{
		Delay_xms(remainder);
	}
}

void Delay_xms(uint32_t nxms)
{
	//记录控制及状态寄存器的值
	uint32_t temp;
	
	SysTick->LOAD = nxms*21000; //自动重装载值
	SysTick->VAL = 0x00; //计数器值
	SysTick->CTRL = 0x01; //开启计时器
	
	do{
			temp = SysTick->CTRL;
		}while((temp&0x01)&&!(temp&(1<<16)));
	
	SysTick->CTRL = 0x00; //关闭计时器
	SysTick->VAL = 0x00; //清空计数器值
}
	
	
